#!/bin/bash

# we_ai_portal 应用停止脚本
# 项目结构:
# - we_ai_portal/lib/ - JAR文件位置
# - we_ai_portal/conf/ - 配置文件位置
# - we_ai_portal/logs/ - 日志文件位置

# 彩色输出函数
function log_info() {
    echo -e "\033[1;32m[INFO] $1\033[0m"
}

function log_error() {
    echo -e "\033[1;31m[ERROR] $1\033[0m"
}

function log_warn() {
    echo -e "\033[1;33m[WARN] $1\033[0m"
}

# 确定脚本所在目录，以定位整个应用结构
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"  # 假设脚本位于bin目录下

# 定义关键目录
LIB_DIR="$ROOT_DIR/lib"
LOG_DIR="$ROOT_DIR/logs"
PID_FILE="$ROOT_DIR/application.pid"

# 应用名称和JAR文件
APP_NAME="we_ai_portal"
JAR_FILE=$(find "$LIB_DIR" -name "*.jar" | head -n 1)

if [ -z "$JAR_FILE" ]; then
    JAR_NAME="未找到JAR文件"
else
    JAR_NAME=$(basename "$JAR_FILE")
fi

# 查找应用进程的函数
find_process() {
    # 尝试通过JAR名称查找
    if [ -n "$JAR_NAME" ] && [ "$JAR_NAME" != "未找到JAR文件" ]; then
        ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}'
    else
        # 如果JAR名称未知，尝试通过lib目录查找
        ps -ef | grep "java.*$LIB_DIR" | grep -v grep | awk '{print $2}'
    fi
}

# 优雅停止函数
stop_gracefully() {
    local pid=$1
    log_info "正在优雅停止 $APP_NAME (PID: $pid)..."
    kill "$pid"

    # 等待进程结束，最多等待30秒
    local timeout=30
    local counter=0
    while [ $counter -lt $timeout ]; do
        if ! ps -p "$pid" > /dev/null 2>&1; then
            log_info "$APP_NAME 已停止"
            return 0
        fi
        sleep 1
        counter=$((counter + 1))
        if [ $((counter % 5)) -eq 0 ]; then
            log_info "仍在等待应用停止... ($counter/$timeout 秒)"
        fi
    done

    log_warn "应用未能在 $timeout 秒内停止，尝试强制终止..."
    kill -9 "$pid"
    sleep 2

    if ! ps -p "$pid" > /dev/null 2>&1; then
        log_info "$APP_NAME 已强制停止"
        return 0
    else
        log_error "无法停止 $APP_NAME (PID: $pid)"
        return 1
    fi
}

# 记录停止操作到日志
record_stop_log() {
    local stop_time=$(date "+%Y-%m-%d %H:%M:%S")
    local stop_log="$LOG_DIR/stop_history.log"

    # 确保日志目录存在
    mkdir -p "$LOG_DIR"

    # 添加停止记录
    echo "$stop_time - 应用已停止: $1" >> "$stop_log"
}

# 主要逻辑
log_info "正在停止 $APP_NAME..."


# 查找相关进程
PIDS=$(find_process)

if [ -z "$PIDS" ]; then
    log_warn "$APP_NAME 未运行"
    # 清理可能存在的过期PID文件
    [ -f "$PID_FILE" ] && rm -f "$PID_FILE"
    exit 0
else
    log_info "发现 $APP_NAME 相关进程: $PIDS"
    STOPPED=true

    for pid in $PIDS; do
        if ! stop_gracefully "$pid"; then
            STOPPED=false
        fi
    done

    # 清理PID文件
    [ -f "$PID_FILE" ] && rm -f "$PID_FILE"

    if $STOPPED; then
        record_stop_log "通过进程查找 (PID: $PIDS)"
        log_info "$APP_NAME 已完全停止"
        exit 0
    else
        log_error "部分进程无法停止，请手动检查"
        exit 1
    fi
fi